#include <stdio.h>
#include <stdlib.h>
#include "matriz.h"

void novaMatriz(Matriz* matriz,int linhas,int colunas){
    //printf("Nova matriz - linhas:%d, colunas:%d\n", linhas,colunas);
    matriz->numLinhas = linhas;
    matriz->numColunas = colunas;
    matriz->matriz = alocaMatriz(linhas, colunas);
    zeraMatriz(matriz);
}

int** alocaMatriz (int numLinhas, int numColunas){
  //printf("Aloca Matriz - numLinhas:%d , numColunas:%d\n", numLinhas,numColunas);
  int** v;  /* ponteiro para a matriz */
  int i;    /* variavel auxiliar      */
  if (numLinhas < 1 || numColunas < 1) { /* verifica parametros recebidos */
     printf ("** Erro: Parametros invalidos.**\n");
     printf ("** Favor inserir valores maiores do que ZERO para o numero de linhas e/ou colunas.**\n");
     exit(0);
     }
  /* aloca as linhas da matriz */
  v = (int**) calloc (numLinhas, sizeof(int));
  if (v == NULL) {
     printf ("** Erro: Memoria Insuficiente **");
     exit(0);
     }
  /* aloca as colunas da matriz */
  for ( i = 0; i < numLinhas; i++ ) {
      v[i] = (int*) calloc (numColunas, sizeof(int));
      if (v[i] == NULL) {
         printf ("** Erro: Memoria Insuficiente **");
         exit(0);
         }
      }
  return (v); /* retorna o ponteiro para a matriz */
}

void imprimeMatrizInfo(Matriz* matriz){
    printf("%d %d\n",matriz->numLinhas, matriz->numColunas);
}

void imprimeMatrizInfoArq(FILE* arqSaida,Matriz* matriz){
    fprintf(arqSaida,"%d %d\n",matriz->numLinhas, matriz->numColunas);
    //printf("%d %d\n",matriz->numLinhas, matriz->numColunas);
}

void imprimeMatriz(Matriz* matriz){
    int linha,coluna;
    for(linha=0;linha<matriz->numLinhas;linha++){
        for(coluna=0;coluna<matriz->numColunas;coluna++){
            printf("%d ",matriz->matriz[linha][coluna]);
        }
        printf("\n");
    }
}

void imprimeMatrizArq(FILE* arqSaida, Matriz* matriz){
    int linha,coluna;
    for(linha=0;linha<matriz->numLinhas;linha++){
        for(coluna=0;coluna<matriz->numColunas;coluna++){
            fprintf(arqSaida, "%d ",matriz->matriz[linha][coluna]);
            //printf("%d ",matriz->matriz[linha][coluna]);
        }
        fprintf(arqSaida,"\n");
    }
}

void liberaMatriz (Matriz* matriz){
    int  i;  /* variavel auxiliar */
    if (matriz->matriz == NULL){
        return;
    }
    for (i=0; i<matriz->numLinhas; i++){
      free (matriz->matriz[i]);
    } /* libera as linhas da matriz */

    free (matriz->matriz);      /* libera a matriz */

    return;
}

void zeraMatriz(Matriz* matriz){

    int aux,aux1;

    for (aux = 0; aux<matriz->numColunas;aux++){
        for (aux1 = 0; aux1<matriz->numLinhas;aux1++){
            matriz->matriz[aux][aux1] = 0;
        }
    }
}
